/**
 * 测试GN决策增强器
 * 
 * 基于919个test目录、3317个GN文件的分析
 * 帮助决定：何时新建test GN，何时修改现有GN
 */

export class TestGnDecisionEnhancer {
    
    /**
     * 决策流程指导
     */
    public static getDecisionFlow(): string {
        return `
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
## 🎯 测试GN决策流程（基于919个test目录的分析）
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

### 核心统计数据

| GN位置模式 | 占比 | 说明 |
|-----------|------|------|
| test目录有BUILD.gn | **42.87%** | 最常见 |
| unittest子目录有BUILD.gn | **28.18%** | 第二常见 |
| test目录没有GN | 31.88% | 依赖上级 |

### 📌 决策规则1：何时新建test/BUILD.gn（42.87%的场景）

✅ **满足以下任一条件时，新建test/BUILD.gn**：

1. test目录不存在BUILD.gn
2. test目录下有多个子目录（unittest、moduletest等）
3. 需要多种测试类型（unittest + moduletest + systemtest）
4. 测试需要独立的配置（特殊的include_dirs、defines等）

**典型结构**：
\`\`\`
your_module/
├── src/              # 源代码
├── BUILD.gn          # 源码GN
└── test/             
    ├── BUILD.gn      # ✅ 新建这个文件
    ├── unittest/
    │   ├── BUILD.gn  # unittest的GN
    │   └── xxx_test.cpp
    └── moduletest/
        ├── BUILD.gn  # moduletest的GN
        └── xxx_test.cpp
\`\`\`

**test/BUILD.gn内容模板**：
\`\`\`gn
import("//build/test.gni")

group("unittest") {
  testonly = true
  deps = [ "unittest:unittest" ]
}

group("moduletest") {
  testonly = true
  deps = [ "moduletest:moduletest" ]
}
\`\`\`

### 📌 决策规则2：何时新建unittest/BUILD.gn（28.18%的场景）

✅ **满足以下任一条件时，新建test/unittest/BUILD.gn**：

1. unittest子目录不存在BUILD.gn
2. unittest目录有多个测试cpp文件
3. 所有测试共享相同的配置

**unittest/BUILD.gn内容模板**：
\`\`\`gn
import("//build/test.gni")
import("../../your_module.gni")  # 如果有模块配置文件

module_output_path = "subsystem/module"

ohos_unittest("module_test") {
  module_out_path = module_output_path
  
  # 必备：指定测试源文件
  sources = [
    "test1.cpp",
    "test2.cpp",
  ]
  
  # 必备：包含路径
  include_dirs = [
    "../../include",
    "../../src",
  ]
  
  # 必备：依赖源码
  deps = [
    "../../src:module_src",  # 依赖源码目标
  ]
  
  # 必备：外部依赖（至少这3个）
  external_deps = [
    "hilog:libhilog",        # 日志（必备）
    "c_utils:utils",         # 工具类（必备）
    "googletest:gtest_main", # 测试框架（必备）
  ]
}

group("unittest") {
  testonly = true
  deps = [ ":module_test" ]
}
\`\`\`

### 📌 决策规则3：何时修改现有unittest/BUILD.gn

⚠️ **仅在以下情况修改现有GN**：

1. unittest/BUILD.gn已存在
2. 新测试与现有测试高度相关（测试同一个模块）
3. 新测试使用相同的配置（include_dirs、deps、external_deps）

**修改方式**：
\`\`\`gn
ohos_unittest("module_test") {
  # ...其他配置保持不变
  
  sources = [
    "existing_test1.cpp",
    "existing_test2.cpp",
    "new_test.cpp",        # ✅ 添加新测试文件
  ]
}
\`\`\`

### 📌 决策规则4：何时修改源码BUILD.gn

❌ **极少修改源码GN，仅在以下特殊情况**：

1. 测试非常简单（只有1-2个文件）
2. 测试和源码紧密耦合
3. 历史原因（遗留代码）

**修改方式**（不推荐）：
\`\`\`gn
# 在源码BUILD.gn末尾添加
group("unittest") {
  testonly = true
  deps = [ "test/unittest:unittest" ]  # 引用test目录的GN
}
\`\`\`

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
`;
    }
    
    /**
     * GN必备依赖指导
     */
    public static getRequiredDependencies(): string {
        return `
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
## 📦 测试GN必备依赖（基于3317个GN文件的统计）
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

### 统计数据

- **81.58%** 的测试GN包含 external_deps
- **98.01%** 的测试GN包含 deps
- 平均 **11.25** 个 external_deps
- 平均 **3.35** 个 deps

### 必备的external_deps（前3个，出现率超过60%）

\`\`\`gn
external_deps = [
  "hilog:libhilog",          # 使用率: 66.3% | 日志系统（必备）
  "c_utils:utils",           # 使用率: 65.9% | C++工具类（必备）
  "googletest:gtest_main",   # 使用率: 32.4% | GTest主程序（必备）
]
\`\`\`

### 常用的external_deps（根据测试场景）

**IPC测试（出现率32.3%）**：
\`\`\`gn
external_deps = [
  # ... 必备3个
  "ipc:ipc_core",            # 使用率: 32.3%
  "samgr:samgr_proxy",       # 使用率: 28.9% | SA管理器
]
\`\`\`

**Ability测试（出现率28.7%）**：
\`\`\`gn
external_deps = [
  # ... 必备3个
  "ability_base:want",       # 使用率: 28.7%
  "ability_runtime:ability_manager",  # 使用率: 12.3%
]
\`\`\`

**Mock测试（出现率28.1%）**：
\`\`\`gn
external_deps = [
  # ... 必备3个
  "googletest:gmock_main",   # 使用率: 28.1% | GMock主程序
]
\`\`\`

**权限测试（出现率23.2%）**：
\`\`\`gn
external_deps = [
  # ... 必备3个
  "access_token:libaccesstoken_sdk",  # 使用率: 23.2%
  "access_token:libtoken_setproc",    # 使用率: 10.8%
  "access_token:libnativetoken",      # 使用率: 9.1%
]
\`\`\`

**事件处理测试（出现率20.3%）**：
\`\`\`gn
external_deps = [
  # ... 必备3个
  "eventhandler:libeventhandler",  # 使用率: 20.3%
]
\`\`\`

**Bundle测试（出现率19.1%）**：
\`\`\`gn
external_deps = [
  # ... 必备3个
  "bundle_framework:appexecfwk_core",  # 使用率: 19.1%
  "bundle_framework:appexecfwk_base",  # 使用率: 18.1%
]
\`\`\`

**NAPI测试（出现率13.4%）**：
\`\`\`gn
external_deps = [
  # ... 必备3个
  "napi:ace_napi",           # 使用率: 13.4%
]
\`\`\`

**性能追踪（出现率15.5%）**：
\`\`\`gn
external_deps = [
  # ... 必备3个
  "hitrace:hitrace_meter",   # 使用率: 15.5%
  "hisysevent:libhisysevent", # 使用率: 15.4%
]
\`\`\`

### deps配置（依赖本地源码）

**典型deps模式**（98.01%的GN使用）：
\`\`\`gn
deps = [
  "../../src:module_src",              # 依赖源码目标（最常见）
  "\${module_path}/common:common_util", # 依赖模块通用工具
  "\${module_path}/frameworks:framework_lib", # 依赖框架库
]
\`\`\`

**使用变量的deps模式**（大型项目常用）：
\`\`\`gn
import("../../your_module.gni")

deps = [
  "\${your_module_path}/services:service_impl",
  "\${your_module_path}/frameworks/native:native_kit",
]
\`\`\`

### 完整示例

**基础UT（只依赖本地模块）**：
\`\`\`gn
ohos_unittest("basic_test") {
  module_out_path = "subsystem/module"
  
  sources = [ "basic_test.cpp" ]
  
  include_dirs = [ "../../include" ]
  
  deps = [ "../../src:module_src" ]
  
  # 最小必备external_deps
  external_deps = [
    "hilog:libhilog",
    "c_utils:utils",
    "googletest:gtest_main",
  ]
}
\`\`\`

**IPC测试（需要IPC能力）**：
\`\`\`gn
ohos_unittest("ipc_test") {
  module_out_path = "subsystem/module"
  
  sources = [ "ipc_test.cpp" ]
  
  include_dirs = [ "../../include" ]
  
  deps = [ "../../src:module_src" ]
  
  # IPC测试必备
  external_deps = [
    "hilog:libhilog",
    "c_utils:utils",
    "googletest:gtest_main",
    "ipc:ipc_core",          # IPC核心
    "samgr:samgr_proxy",     # SA管理器
  ]
}
\`\`\`

**Mock测试（需要GMock）**：
\`\`\`gn
ohos_unittest("mock_test") {
  module_out_path = "subsystem/module"
  
  sources = [
    "mock_callback.cpp",
    "service_test.cpp",
  ]
  
  include_dirs = [
    "../../include",
    "include",  # Mock头文件
  ]
  
  deps = [ "../../src:module_src" ]
  
  # Mock测试必备
  external_deps = [
    "hilog:libhilog",
    "c_utils:utils",
    "googletest:gtest_main",
    "googletest:gmock_main",  # GMock
  ]
}
\`\`\`

**权限测试（需要AccessToken）**：
\`\`\`gn
ohos_unittest("permission_test") {
  module_out_path = "subsystem/module"
  
  sources = [ "permission_test.cpp" ]
  
  include_dirs = [ "../../include" ]
  
  deps = [ "../../src:module_src" ]
  
  # 权限测试必备
  external_deps = [
    "hilog:libhilog",
    "c_utils:utils",
    "googletest:gtest_main",
    "access_token:libaccesstoken_sdk",  # 权限SDK
    "access_token:libtoken_setproc",    # 设置权限
  ]
}
\`\`\`

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
`;
    }
    
    /**
     * 完整的决策示例
     */
    public static getDecisionExamples(): string {
        return `
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
## 📝 完整决策示例
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

### 场景1：新模块首次添加测试（42.87%的场景）

**当前目录结构**：
\`\`\`
foundation/newmodule/services/newsvc/
├── src/
│   ├── service_impl.cpp
│   └── BUILD.gn
├── include/
│   └── service.h
└── BUILD.gn  # 只有源码配置
\`\`\`

**需求**：为service_impl.cpp添加单元测试

**决策**：✅ 新建test/BUILD.gn + test/unittest/BUILD.gn

**操作步骤**：

1. 创建目录结构：
\`\`\`
foundation/newmodule/services/newsvc/
├── src/
├── include/
├── BUILD.gn
└── test/              # ✅ 新建
    ├── BUILD.gn       # ✅ 新建
    └── unittest/      # ✅ 新建
        ├── BUILD.gn   # ✅ 新建
        └── service_impl_test.cpp  # ✅ 新建
\`\`\`

2. 创建test/BUILD.gn：
\`\`\`gn
import("//build/test.gni")

group("unittest") {
  testonly = true
  deps = [ "unittest:unittest" ]
}
\`\`\`

3. 创建test/unittest/BUILD.gn：
\`\`\`gn
import("//build/test.gni")

ohos_unittest("newsvc_test") {
  module_out_path = "newmodule/newsvc"
  
  sources = [ "service_impl_test.cpp" ]
  
  include_dirs = [
    "../../include",
    "../../src",
  ]
  
  deps = [ "../../src:newsvc" ]
  
  external_deps = [
    "hilog:libhilog",
    "c_utils:utils",
    "googletest:gtest_main",
  ]
}

group("unittest") {
  testonly = true
  deps = [ ":newsvc_test" ]
}
\`\`\`

### 场景2：为现有测试添加新测试文件（28.18%的场景）

**当前目录结构**：
\`\`\`
foundation/newmodule/services/newsvc/
└── test/
    ├── BUILD.gn       # 已存在
    └── unittest/
        ├── BUILD.gn   # 已存在
        └── service_impl_test.cpp  # 已存在
\`\`\`

**需求**：添加新测试service_manager_test.cpp

**决策**：⚠️ 修改test/unittest/BUILD.gn

**操作步骤**：

1. 创建新测试文件：
\`\`\`
test/unittest/service_manager_test.cpp  # ✅ 新建
\`\`\`

2. 修改test/unittest/BUILD.gn：
\`\`\`gn
ohos_unittest("newsvc_test") {
  module_out_path = "newmodule/newsvc"
  
  sources = [
    "service_impl_test.cpp",
    "service_manager_test.cpp",  # ✅ 添加
  ]
  
  # ... 其他配置保持不变
}
\`\`\`

### 场景3：添加moduletest（29.38%的场景）

**当前目录结构**：
\`\`\`
foundation/newmodule/services/newsvc/
└── test/
    ├── BUILD.gn       # 已存在
    └── unittest/      # 已存在
        ├── BUILD.gn
        └── service_impl_test.cpp
\`\`\`

**需求**：添加模块测试

**决策**：✅ 新建test/moduletest/BUILD.gn

**操作步骤**：

1. 创建目录结构：
\`\`\`
test/
├── BUILD.gn           # 需要修改
├── unittest/          # 已存在
└── moduletest/        # ✅ 新建
    ├── BUILD.gn       # ✅ 新建
    └── newsvc_module_test.cpp  # ✅ 新建
\`\`\`

2. 创建test/moduletest/BUILD.gn：
\`\`\`gn
import("//build/test.gni")

ohos_moduletest("newsvc_module_test") {
  module_out_path = "newmodule/newsvc"
  
  sources = [ "newsvc_module_test.cpp" ]
  
  include_dirs = [
    "../../include",
    "../../src",
  ]
  
  deps = [ "../../src:newsvc" ]
  
  external_deps = [
    "hilog:libhilog",
    "c_utils:utils",
    "googletest:gtest_main",
    # 模块测试可能需要更多依赖
    "ipc:ipc_core",
    "samgr:samgr_proxy",
  ]
}

group("moduletest") {
  testonly = true
  deps = [ ":newsvc_module_test" ]
}
\`\`\`

3. 修改test/BUILD.gn，添加moduletest引用：
\`\`\`gn
import("//build/test.gni")

group("unittest") {
  testonly = true
  deps = [ "unittest:unittest" ]
}

# ✅ 添加moduletest组
group("moduletest") {
  testonly = true
  deps = [ "moduletest:moduletest" ]
}
\`\`\`

### 场景4：带Mock的测试（14.32%需要Mock）

**需求**：为IPC服务添加Mock测试

**决策**：✅ 新建test/unittest/BUILD.gn，包含Mock配置

**目录结构**：
\`\`\`
test/
└── unittest/
    ├── BUILD.gn
    ├── include/
    │   └── mock_callback.h  # Mock类定义
    └── src/
        ├── mock_callback.cpp  # Mock实现
        └── service_test.cpp   # 测试
\`\`\`

**test/unittest/BUILD.gn**：
\`\`\`gn
import("//build/test.gni")

ohos_unittest("newsvc_mock_test") {
  module_out_path = "newmodule/newsvc"
  
  sources = [
    "src/mock_callback.cpp",
    "src/service_test.cpp",
  ]
  
  include_dirs = [
    "include",           # Mock头文件
    "../../include",
    "../../src",
  ]
  
  deps = [ "../../src:newsvc" ]
  
  external_deps = [
    "hilog:libhilog",
    "c_utils:utils",
    "googletest:gtest_main",
    "googletest:gmock_main",  # ✅ GMock必备
  ]
}

group("unittest") {
  testonly = true
  deps = [ ":newsvc_mock_test" ]
}
\`\`\`

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
`;
    }
    
    /**
     * 构建完整的增强Prompt
     */
    public static enhancePrompt(basePrompt: string): string {
        return `${basePrompt}

${this.getDecisionFlow()}

${this.getRequiredDependencies()}

${this.getDecisionExamples()}

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
## 🎯 最终决策原则（基于919个test目录的统计）
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

### 何时新建GN（推荐，占比71.05%）

1. ✅ **test目录不存在BUILD.gn** → 新建test/BUILD.gn（42.87%）
2. ✅ **unittest子目录不存在BUILD.gn** → 新建unittest/BUILD.gn（28.18%）
3. ✅ **需要添加新测试类型** → 新建{type}/BUILD.gn（如moduletest）
4. ✅ **新测试与现有测试不相关** → 新建独立的BUILD.gn

### 何时修改现有GN（少数，占比28.95%）

1. ⚠️ **unittest/BUILD.gn已存在且新测试高度相关** → 修改sources
2. ⚠️ **test/BUILD.gn已存在且需要添加新类型引用** → 修改group
3. ⚠️ **测试非常简单（1-2个文件）** → 可能修改源码GN

### 必备配置检查清单

- [ ] module_out_path = "subsystem/module"
- [ ] sources = [ ... ]
- [ ] include_dirs = [ "../../include" ]
- [ ] deps = [ "../../src:xxx" ]
- [ ] external_deps至少包含：hilog:libhilog, c_utils:utils, googletest:gtest_main
- [ ] group("unittest") 引用测试目标

### 依赖选择速查表

| 测试场景 | 必须添加的external_deps |
|---------|----------------------|
| 基础UT | hilog, c_utils, gtest_main |
| Mock测试 | +gmock_main |
| IPC测试 | +ipc:ipc_core, samgr:samgr_proxy |
| 权限测试 | +access_token:libaccesstoken_sdk |
| NAPI测试 | +napi:ace_napi |
| Ability测试 | +ability_base:want, ability_runtime:ability_manager |

**这些不是建议，而是基于919个test目录、3317个GN文件的真实统计！**

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
`;
    }
}

